#ifndef _DRAWING_EVENT_H_
#define _DRAWING_EVENT_H_

#include "event.h"

#define DRAWING_EVENT_TYPE 111

/**
* Enumeracion de tipos de eventos de 
* dibujo disponibles
*/
typedef enum __DrawingEventType
{
	LINE,
	RECTANGLE,
	ELLIPSE,
	CIRCLE,
	TRIANGLE,
	FILLED_RECTANGLE,
	FILLED_ELLIPSE,
	FILLED_CIRCLE,
	FILLED_TRIANGLE,
	HAND_DRAW,
} DrawingEventType;

/**
* @brief Clase que modela un evento de dibujo
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Clase que modela un evento de dibujo para transmitir informacion 
* acerca de figuras geometricas. Esta clase pone como campo "type" 
* el valor definido por @see DRAWING_EVENT_TYPE. Ademas, agrega
* un campo llamado "draw_type" que se asignara con algun valor
* definido por la enumeracion @see __DrawingEventType, y otro
* campo llamado "color" que contendra una cadena de texto con la 
* representacion en hexadecimal del color de la figura (ej: 0x2384ff).
*/
class DrawingEvent : public Event{
public:
	/**
	* Constructor. Se definira como color por defecto
	* el negro (0x000000).
	*
	* @param d_evt_type Subtipo de evento de dibujo
	*/
	DrawingEvent(DrawingEventType d_evt_type);
	
	/**
	* Destructor
	*/
	virtual ~DrawingEvent();
	
	/**
	* Obtiene el subtipo del evento de dibujo
	*
	* @return Subtipo del evento de dibujo de entre los definidos
	*         en la enumeracion @see __DrawingEventType.
	*/
	int get_subtype();
	
	/**
	* Obtiene el color de la figura en representacion hexadecimal (ej: 0x2384ff)
	*
	* @return Color de la figura en representacion hexadecimal
	*/
	const char* color();
	
	/**
	* Asigna el color de la figura. Si la cadena no se corresponde con un
	* valor hexadecimal de seis cifras valido y comenzado por "0x", entonces
	* no se cambiara el color.
	*
	* @param c Color para la figura
	*/
	void color(const char* c);
};

/**
* @brief Clase que modela un evento que transmite una linea
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite una linea. Para ello crea
* los campos "x0", "y0", "x1" e "y1" en el evento.
*/
class LineEvent : public DrawingEvent{
public:
	LineEvent(float x0, float y0, float x1, float y1);	
	float x0();
	float y0();
	float x1();
	float y1();
};

/**
* @brief Clase que modela un evento que transmite un rectangulo
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un rectangulo. Para ello crea
* los campos "x", "y", "width" e "height" en el evento. Los
* valores x e y indican la posicion de la esquina superior izquierda.
*/
class RectangleEvent : public DrawingEvent {
public:
	RectangleEvent(float x, float y, float width, float height);
	float x();
	float y();
	float width();
	float height();
};

/**
* @brief Clase que modela un evento que transmite un rectangulo relleno
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un rectangulo relleno. Tiene metodos
* para asignar el color de relleno o para obtenerlo.
*/
class FilledRectangleEvent : public RectangleEvent {
public:
	FilledRectangleEvent(float x, float y, float width, float height);
	const char* fill_color();
	void fill_color(const char* c);
};

/**
* @brief Clase que modela un evento que transmite una elipse
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite una elipse. Para ello crea
* los campos "x", "y", "width" e "height" en el evento. Los
* valores x e y indican la posicion del centro de la elipse.
*/
class EllipseEvent : public DrawingEvent {
public:
	EllipseEvent(float x, float y, float width, float height);
	float x();
	float y();
	float width();
	float height();
};

/**
* @brief Clase que modela un evento que transmite una elipse rellena
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite una elipse rellena. Para ello crea
* los campos "x", "y", "width" e "height" en el evento. Los
* valores x e y indican la posicion del centro de la elipse. Tiene metodos
* para asignar el color de relleno o para obtenerlo.
*/
class FilledEllipseEvent : public EllipseEvent {
public:
	FilledEllipseEvent(float x, float y, float width, float height);
	const char* fill_color();
	void fill_color(const char* c);
};

/**
* @brief Clase que modela un evento que transmite un circulo
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un circulo. Para ello crea
* los campos "x", "y", y "radius" en el evento. Los valores 
* x e y indican la posicion del centro del circulo.
*/
class CircleEvent : public DrawingEvent {
public:
	CircleEvent(float x, float y, float radius);
	float x();
	float y();
	float radius();
};

/**
* @brief Clase que modela un evento que transmite un circulo relleno
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un circulo relleno. Para ello crea
* los campos "x", "y", y "radius" en el evento. Los valores x e y 
* indican la posicion del centro del circulo. Tiene metodos
* para asignar el color de relleno o para obtenerlo.
*/
class FilledCircleEvent : public CircleEvent{
public:
	FilledCircleEvent(float x, float y, float radius);
	const char* fill_color();
	void fill_color(const char* c);
};

/**
* @brief Clase que modela un evento que transmite un triangulo
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un triangulo. Para ello crea
* los campos "x0", "y0", "x1", "y1", "x2" y "y2" en el evento.
*/
class TriangleEvent : public DrawingEvent{
public:
	TriangleEvent(float x0, float y0, float x1, float y1, float x2, float y2);
	float x0();
	float y0();
	float x1();
	float y1();
	float x2();
	float y2();
};

/**
* @brief Clase que modela un evento que transmite un triangulo relleno
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un triangulo relleno. Para ello crea
* los campos "x0", "y0", "x1", "y1", "x2" y "y2" en el evento. Tiene metodos
* para asignar el color de relleno o para obtenerlo.
*/
class FilledTriangleEvent : public TriangleEvent {
public:
	FilledTriangleEvent(float x0, float y0, float x1, float y1, float x2, float y2);
	const char* fill_color();
	void fill_color(const char* c);
};

/**
* @brief Clase que modela un evento que transmite un dibujo a mano alzada
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un dibujo a mano alzada. Para ello crea
* los campos "x0", "y0", "x1", "y1", ..., "xn" y "yn" en el evento.
*/
class HandDrawEvent : public DrawingEvent{
public:
	HandDrawEvent(int npoints);
	int npoints();
	float xn(int n);
	float yn(int n);
	void xn(int n, float f);
	void yn(int n, float f);
};

#endif
